/*
我们讨论一个如何使用基本运算将两个集合合并的问题。下面，是采用基本操作完成集合合并的操作。

问题： 线性表的合并A＝A∪B
设：有两个集合A和B分别用两个线性表LA和LB表示。求一个新的集合 A＝A∪B。

输入：两个集合

输出：按照要求合并后的集合。

编程要求：题目中已经给出了主函数和部分已经实现的基本操作，请阅读给出的程序，编写其他尚未完成的基本操作（基本操作的定义请参见严蔚敏老师的教材）。

注意：提交代码的时候，仅需提交你编写的那三个基本操作函数即可。
*/

/*
测试用例1：
输入：
5↵
1 2 3 4 5↵
6↵
3 4 5 6 7 8↵
输出：
Output La:1,2,3,4,5,↵
Output Lb:3,4,5,6,7,8,↵
Result La:1,2,3,4,5,6,7,8,↵

测试用例2：
输入：
0↵
4↵
1 2 3 4↵
输出：
Output La:↵
Output Lb:1,2,3,4,↵
Result La:1,2,3,4,↵

测试用例3：
输入：
5↵
8 9 0 1 2↵
6↵
8 9 0 3 2 1↵
输出：
Output La:8,9,0,1,2,↵
Output Lb:8,9,0,3,2,1,↵
Result La:8,9,0,1,2,3,↵
*/

// 以下是预设代码
#include <stdio.h>
#include <stdlib.h>
#define LIST_MAX_SIZE  100  //空间初始大小
#define OK 1
#define ERROR 0

typedef int ElemType;       //元素的数据类型
typedef int Status;         //状态。函数返回值

typedef struct {
//  ElemType elem[ LIST_MAX_SIZE ]; // 存储空间
    ElemType * elem;    // 存储空间
    int  length;        // 当前元素个数
    int  listsize;      // 能够保存的最大元素数量
} SqList;  

// 以下为函数原型   
Status InitList( SqList & );
Status ListInsert( SqList &, int, ElemType );   //这是需要你编写的基本操作
Status GetElem( SqList, int, ElemType & );  //这是需要你编写的基本操作
int    ListLength( SqList );        //这是需要你编写的基本操作
Status ListTraverse( SqList &, void (*)( ElemType ) );  
void   ListUnion( SqList &, SqList );  
void   out( ElemType );  
int    equal(ElemType, ElemType );   
Status LocateElem(SqList, ElemType, Status (*)(ElemType,ElemType));  

// 列表初始化 
Status InitList( SqList & L )   // 建立一个空的线性表 L  
{
    // 分配存储空间
    L.elem = (ElemType *)malloc(LIST_MAX_SIZE*sizeof(ElemType));
    
    // 列表初始长度为0
    L.length = 0;
    
    // 设置列表最大容量
    L.listsize = LIST_MAX_SIZE;
    
    // 初始化成功
    return OK;
}  

// 遍历列表
Status ListTraverse( SqList &L, void (*visit)( ElemType ) )
{
    // 初始化i，获取列表长度
    int i, L_len = ListLength( L );
    
    // 存储元素
    ElemType e;

    for ( i = 1; i <= L_len; i++ ) 
    {
        // 获取列表中的元素
        GetElem(L, i, e);
        
        // 打印
        (*visit)( e );  
    }
    return OK;  
}

// 判断是否相等
int equal(ElemType x, ElemType y)
{
  return x==y;
}

// 在集合中查找元素：成功返回位序，失败返回0
Status LocateElem( SqList L, ElemType e,
                   Status (*compare)(ElemType,ElemType) )
{
    int i = 1;
    ElemType * p;
    
    // 遍历集合
    while ( i<=L.length )
        if  ( (*compare)(e,L.elem[i-1]) ) break; // 如果发现元素，则停止遍历
        else  i++; // 否则继续遍历
      
    // 找到 e，返回位序i
    if ( i <= L.length )  return i;
    
    // 若没有找到，则返回0
    else return 0;
}  

// 打印操作
void out( ElemType e )
{
  printf("%d,", e);
}
  
// 求 A＝A∪B
void ListUnion( SqList &La,  SqList Lb )   
{
    int La_len, Lb_len, i;
    ElemType e;
    
    // 获取两集合长度
    La_len = ListLength( La );       // 求线性表的长度  
    Lb_len = ListLength( Lb );
    
    // 遍历B集合中的元素
    for ( i = 1;  i <= Lb_len;  i++ )  {
        // 取出元素
        GetElem(Lb, i, e);
        
        // 如果元素不在A集合中
        if ( !LocateElem( La, e, equal ) )
            ListInsert ( La, ++La_len, e ); // 将元素添加进 A集合
    }
}

Status ListInsert( SqList &L, int i, ElemType e ) 
{   //在顺序线性表L中第 i (1≤i≤L.length+1)个位置之前插入元素e, 
  
  // Here is wating for you. 
  L.elem[i-1] = e;
  L.length++;
  return OK;
}

Status GetElem(SqList L, int i, ElemType &e) 
{
  // Here is wating for you. 
  e = L.elem[i-1];
  return OK;
} 

int ListLength(SqList L) 
{
  
  // Here is wating for you. 
  return L.length;
}

int main()  
{
    SqList La, Lb;  
    int n, i;
    ElemType e;
      
    InitList( La );
    InitList( Lb );
    
    // 读入集合A
    scanf("%d", &n); // 集合A的元素个数
    for ( i=0; i<n; i++ )
    {
        scanf("%d", &e);
        ListInsert( La, i+1, e );
    }
  
    // 读入集合B
    scanf("%d", &n);
    for ( i=0; i<n; i++ ) // 集合B的元素个数
    {
        scanf("%d", &e);
        ListInsert( Lb, i+1, e );
    }
    
    // 打印
    printf("Output La:");
    ListTraverse( La, out );
    printf("\nOutput Lb:");
    ListTraverse( Lb, out );
    
    // 合并
    ListUnion( La, Lb );
    
    // 打印
    printf("\nResult La:");
    ListTraverse( La, out );
    printf("\n");
    return OK;
}
  



  
/* PRESET CODE END - NEVER TOUCH CODE ABOVE */  